﻿using System.Diagnostics.Contracts;

namespace System
{
    /// <summary>Аргумент события с типизированным параметром</summary>
    /// <typeparam name="TArgument">Тип параметра аргумента</typeparam>
    public class EventArgs<TArgument> : EventArgs
    {
        /* ------------------------------------------------------------------------------------------ */

        /// <summary>Параметр аргумента</summary>
        public TArgument Argument { get; protected set; }

        /* ------------------------------------------------------------------------------------------ */

        /// <summary>Новый аргумент события с типизированным параметром</summary>
        /// <param name="Argument">Параметр аргумента</param>
        [Diagnostics.DebuggerStepThrough]
        public EventArgs(TArgument Argument)
        {
            Contract.Requires(Argument != null);
            this.Argument = Argument;
        }

        /* ------------------------------------------------------------------------------------------ */

        /// <summary>
        /// Возвращает объект <see cref="T:System.String"/>, который представляет текущий объект <see cref="T:System.Object"/>.
        /// </summary>
        /// <returns>Объект <see cref="T:System.String"/>, представляющий текущий объект <see cref="T:System.Object"/>.</returns>
        /// <filterpriority>2</filterpriority>
        [Diagnostics.DebuggerStepThrough]
        public override string ToString() { return Argument.ToString(); }

        /* ------------------------------------------------------------------------------------------ */

        /// <summary>Оператор неявного преобразования аргумента события к типу содержащегося в нём значения </summary>
        /// <param name="Args">Аргумент события</param>
        /// <returns>Хранимый объект</returns>
        [Diagnostics.DebuggerStepThrough]
        public static implicit operator TArgument(EventArgs<TArgument> Args) { return Args.Argument; }

        /// <summary>
        /// Оgератор неявного преобразования типа зранимого значения в обёртку из аргумента события, содержащего это значение
        /// </summary>
        /// <param name="Argument">Объект аргумента события</param>
        /// <returns>Аргумент события</returns>
        [Diagnostics.DebuggerStepThrough]
        public static implicit operator EventArgs<TArgument>(TArgument Argument) { return new EventArgs<TArgument>(Argument); }

        /* ------------------------------------------------------------------------------------------ */
    }
}